package utils

import (
	"crypto/md5"
	"crypto/sha1"
	"encoding/hex"
	"encoding/json"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

// 将字符串反解析为数组 "[1,2,3]" => [1,2,3]
func String2Array(str string) (arr []int) {
	_ = json.Unmarshal([]byte(str), &arr)
	return arr
}

//将字符串加密成 md5
func Md5(str string) string {
	o := md5.New()
	o.Write([]byte(str))
	md5Data := o.Sum([]byte(""))
	return hex.EncodeToString(md5Data)
}

func Sha1(data string) string {
	o := sha1.New()
	o.Write([]byte(data))
	return hex.EncodeToString(o.Sum([]byte("")))
}

//RandomString 在数字、大写字母、小写字母范围内生成num位的随机字符串
func RandomString(length int) string {
	// 48 ~ 57 数字
	// 65 ~ 90 A ~ Z
	// 97 ~ 122 a ~ z
	// 一共62个字符，在0~61进行随机，小于10时，在数字范围随机，
	// 小于36在大写范围内随机，其他在小写范围随机
	rand.Seed(time.Now().UnixNano())
	result := make([]string, 0, length)
	for i := 0; i < length; i++ {
		t := rand.Intn(62)
		if t < 10 {
			result = append(result, strconv.Itoa(rand.Intn(10)))
		} else if t < 36 {
			result = append(result, string(rand.Intn(26)+65))
		} else {
			result = append(result, string(rand.Intn(26)+97))
		}
	}
	return strings.Join(result, "")
}

func RemoveElement(nums []int64, val int64) []int64 {
	//如果是空切片，那就返回0
	if len(nums) == 0 {
		return nums
	}
	//用一个索引
	//循环去比较
	//当一样的时候就删除对应下标的值
	//当不一样的时候，索引加1
	index := 0
	for index < len(nums) {
		if nums[index] == val {
			nums = append(nums[:index], nums[index+1:]...)
			continue
		}
		index++
	}
	return nums
}
